﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
using System.Windows.Threading;
using System.Linq;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter;

namespace Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient
{
    public partial class ManutencaoOrdens : SinacorWindow, IManutencaoOrdens
    {
        #region Event Handlers

        #region Grid Ordens

        /// <summary>
        /// ApplyingStyle event - dtgOrdens
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                // Limpando style
                _style = string.Empty;

                // Verifica se quem disparou o evento foi uma linha
                if (e.OriginalSource is BaseRow)
                {
                    //Verifica estado ordem
                    this.PresenterManutencaoOrdens.VerificarEstadoOrdem(e.ItemInfo.Item as Model.Ordem);
                }

                // Retornando style
                e.Style = _style;
            }
        }

        private void dtgOrdens_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dtgOrdens.SelectedItems.Count == 0)
            {
                this.PresenterManutencaoOrdens.OrdemAtual = null;
                this.PresenterManutencaoOrdens.OrdensAtuais = null;
                tabJustificativas.IsEnabled = false;
            }
            else if (dtgOrdens.SelectedItems.Count == 1)
            {
                this.PresenterManutencaoOrdens.OrdemAtual = (Model.Ordem)dtgOrdens.SelectedItem;
                this.PresenterManutencaoOrdens.OrdensAtuais = null;
                tabJustificativas.IsEnabled = true;
            }
            else
            {
                //Atribui CurrentModel ao objeto OrdensAtuais da Presenter
                this.PresenterManutencaoOrdens.OrdemAtual = null;
                this.PresenterManutencaoOrdens.OrdensAtuais = new ModelCollection<Model.Ordem>(dtgOrdens.SelectedItems);
                tabJustificativas.IsEnabled = true;
            }

            //Verifica Ordem Financiamento POP
            this.PresenterManutencaoOrdens.VerificarOrdemFinanciamentoPOP();
        }

        /// <summary>
        /// InsertBegun event - dtgOrdens
        /// </summary>
        private void dtgOrdens_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                PresenterManutencaoOrdens.ModoUtilizado = Model.Enum.ModoTela.Grade;
                PresenterManutencaoOrdens.Estado = Model.Enum.EstadoTela.Inclusao;

                // Carrega a ordem atual
                PresenterManutencaoOrdens.OrdemAtual = CurrentModel;

                PresenterManutencaoOrdens.ConfigurarManutencaoUnitaria();
            }
        }

        /// <summary>
        /// EndingInsert event - dtgOrdens
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                FinalizarEdicaoOrdemGrid();
            }
        }

        /// <summary>
        /// InsertEnded event - dtgOrdens
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_InsertEnded(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                PresenterManutencaoOrdens.Estado = Model.Enum.EstadoTela.Leitura;

                ResetarEstadoCampos();
            }
        }

        private void dtgOrdens_InsertCanceled(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                CancelarInsercaoAlteracaoGrid();

                ResetarEstadoCampos();
            }
        }

        /// <summary>
        /// dtgOrdens - UpdateCanceled event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_UpdateCanceled(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                CancelarInsercaoAlteracaoGrid();
                
                ResetarEstadoCampos();

                this.PresenterManutencaoOrdens.OrdemAtual = (Model.Ordem)dtgOrdens.SelectedItem;
            }
        }

        /// <summary>
        /// dtgOrdens - UpdateEnded event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_UpdateEnded(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                PresenterManutencaoOrdens.Estado = Model.Enum.EstadoTela.Leitura;

                ResetarEstadoCampos();
            }
        }

        /// <summary>
        /// dtgOrdens - EndingUpdate event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                FinalizarEdicaoOrdemGrid();
            }
        }

        /// <summary>
        /// dtgOrdens - BeingUpdated event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_BeingUpdated(object sender, CancelItemEventArgs e)
        {
            if (((SinacorDataGrid)sender).SelectedItems.Count != 1)
            {                
                e.Cancel = true;
            }
        }
        
        /// <summary>
        /// dtgOrdens - UpdateBegun event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgOrdens_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                PresenterManutencaoOrdens.ModoUtilizado = Model.Enum.ModoTela.Grade;
                PresenterManutencaoOrdens.Estado = Model.Enum.EstadoTela.Alteracao;

                PresenterManutencaoOrdens.ConfigurarManutencaoUnitaria();
                dtgOrdens.Columns["Cliente"].AllowUpdate = PresenterManutencaoOrdens.Permissoes.PermiteAlterarCliente;
            }
        }

        /// <summary>
        /// SelectionChanged event - cboTiposMercados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cboTiposMercados_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (((SinacorComboBox)sender).SelectedItem != null)
            {
                //Configura mercado
                this.PresenterManutencaoOrdens.ConfigurarMercado(((EnumWrapper<Model.Enum.TipoMercado>)((SinacorComboBox)sender).SelectedItem).Value);
            }
        }

        /// <summary>
        /// SelectionChanged event - cboTiposOrdens
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cboTiposOrdens_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (((SinacorComboBox)sender).SelectedItem != null
                && CurrentModel != null)
            {
                //Configura tipo ordem
                this.PresenterManutencaoOrdens.ConfigurarTipoOrdem(CurrentModel.TipoOrdem.Value);
            }
        }

        /// <summary>
        /// LostFocus event - txtClienteOrdem
        /// </summary>
        private void txtClienteOrdem_LostFocus(object sender, RoutedEventArgs e)
        {
            if (dtgOrdens.IsEditing)
            {
                this.PresenterManutencaoOrdens.OrdemAtual = (Model.Ordem)this.dtgOrdens.EditItem;

                this.PresenterManutencaoOrdens.ConfigurarCliente();
            }
        }

        /// <summary>
        /// Alimenta o nome da bolsa quando o mesmo é selecionado no datagrid
        /// </summary>
        private void cboBolsa_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (((SinacorComboBox)sender).SelectedItem != null && this.CurrentModel != null)
                this.CurrentModel.NomeBolsa = ((Model.Bolsa)(((SinacorComboBox)sender).SelectedItem)).Descricao;
        }

        /// <summary>
        /// Alimenta o login do operador quando o mesmo é selecionado no datagrid
        /// </summary>
        private void CboOperador_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (((SinacorComboBox)sender).SelectedItem != null && this.CurrentModel != null)
                this.CurrentModel.LoginOperador = ((Model.Operador)(((SinacorComboBox)sender).SelectedItem)).LoginOperador;
        }

        private void dtgOrdens_SavingAll(object sender, CancelItemsEventArgs e)
        {
            ShowUserWaitingProcess();

            try
            {
                LimparErrosModel();

                e.Cancel = PresenterManutencaoOrdens.Salvar();
            }
            finally
            {
                this.HideUserWaitingProcess();
            }
        }

        #endregion

        #endregion

        #region Métodos Privados

        #region Grid Ordens

        private void CancelarInsercaoAlteracaoGrid()
        {
            PresenterManutencaoOrdens.Estado = Model.Enum.EstadoTela.Leitura;

            //Desabilita aba financiamento POP
            DesabilitarAbaFinanciamentoPOP();
        }

        private void CancelarOrdens()
        {
            if (dtgOrdens.HasItems)
            {
                SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ManutencaoOrdens.Message.ConfirmaCancelamentoOrdem").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

                if (result == SinacorMessageBoxResult.Yes)
                {
                    ShowUserWaitingProcess();

                    if (PresenterManutencaoOrdens.OrdensAtuais == null)
                    {
                        PresenterManutencaoOrdens.ObterSaldoNegociavel(PresenterManutencaoOrdens.OrdemAtual, null);

                        PresenterManutencaoOrdens.IncluirJustificativa(PresenterManutencaoOrdens.OrdemAtual);
                    }
                    else
                    {
                        foreach (Model.Ordem ordem in PresenterManutencaoOrdens.OrdensAtuais)
                        {
                            PresenterManutencaoOrdens.ObterSaldoNegociavel(ordem, null);

                            PresenterManutencaoOrdens.IncluirJustificativa(ordem);
                        }
                    }

                    HideUserWaitingProcess();

                    dtgOrdens.Delete();
                }
            }
        }

        private void MarcarCasamento()
        {
            Model.DetalheOrdem detalhe = null;

            if (DtgDetalhes.SelectedItem != null)
            {
                detalhe = DtgDetalhes.SelectedItem as Model.DetalheOrdem;
                DtgDetalhes.Update(DtgDetalhes.SelectedIndex, detalhe);

                PresenterManutencaoOrdens.ConfigurarOrdemCasarDetalhes();
            }
        }

        private void FecharOrdem()
        {
            ShowUserWaitingProcess();

            //Verifica se existe ordem atual
            if (this.PresenterManutencaoOrdens.OrdemAtual != null)
            {
                //Fecha ordem administrada concorrente
                this.PresenterManutencaoOrdens.FecharOrdemAdministradaConcorrente(this.PresenterManutencaoOrdens.OrdemAtual);
            }

            HideUserWaitingProcess();
        }

        private void FinalizarEdicaoOrdemGrid()
        {
            //Atribui CurrentModel ao objeto OrdemAtual da Presenter
            this.PresenterManutencaoOrdens.OrdemAtual = this.CurrentModel;

            //Obtem saldo negociavel
            this.PresenterManutencaoOrdens.ObterSaldoNegociavel(this.CurrentModel, Model.Enum.NaturezaOperacao.Venda);

            if (PresenterManutencaoOrdens.Estado == Model.Enum.EstadoTela.Alteracao)
            {
                PresenterManutencaoOrdens.IncluirJustificativa(PresenterManutencaoOrdens.OrdemAtual);
            }

            //Desabilita aba financiamento POP
            this.DesabilitarAbaFinanciamentoPOP();
        }

        #endregion

        /// <summary>
        /// Consulta pre-boletos
        /// </summary>
        private void ConsultarPreBoletos()
        {
            Model.ChaveOrdem ordem = null;
            CasamentoPreBoletos casamentoPreBoletos = null;

            if (PresenterManutencaoOrdens.ValidarOrdemPreBoleto())
            {
                if (CurrentModelDetalhe != null)
                {
                    ordem = new Model.ChaveOrdem
                    {
                        NumeroOrdem = CurrentModelDetalhe.NumeroOrdem == null ? 0 : Convert.ToInt32(CurrentModelDetalhe.NumeroOrdem),
                        NumeroOrdemSubSequencia = CurrentModelDetalhe.NumeroOrdemSubSequencia == null ? 0 : Convert.ToInt32(CurrentModelDetalhe.NumeroOrdemSubSequencia),
                        DataOrdem = CurrentModelDetalhe.DataOrdem
                    };

                    casamentoPreBoletos = new CasamentoPreBoletos(ordem);
                    casamentoPreBoletos.SetMenuHeader("Bovespa.Ordens.Label.ManutencaoOrdens");
                    casamentoPreBoletos.Owner = this;
                    casamentoPreBoletos.ShowDialog();
                }
            }
        }

        #endregion
    }
}
